package src.B_File;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {

        File f3 = new File("E:\\Project\\JavaSE\\src\\B_File\\txtTest");
        // .exists()判断该文件是否存在，.isDirectory()判断该文件是否为目录，.mkdir()创建单级文件夹，.mkdirs()创建多级文件夹包含单级
        if (!f3.exists() && !f3.isDirectory()) f3.mkdirs(); // 如果文件夹不存在，则创建
        File f1 = new File("E:\\Project\\JavaSE\\src\\B_File\\txtTest\\a.txt");
        if (!f1.exists()) f1.createNewFile(); // 如果文件不存在，则创建
        File f2 = new File("src\\B_File\\txtTest\\b.xlsx");
        if (!f2.exists()) f2.createNewFile(); // 如果文件不存在，则创建
        // .getAbsolutePath() 返回文件的绝对路径
        System.out.println(f1.getAbsolutePath());
        System.out.println(f2.getAbsolutePath());
        System.out.println();
        // .getPath() <==> .toString() 返回文件传入的路径，绝对则返回绝对，相对则返回相对
        System.out.println(f1.getPath()); // System.out.println(f1.toString());
        System.out.println(f2.getPath()); // System.out.println(f2.toString());
        System.out.println();
        // .getName() 获取构造方法传递路径的结尾部分（文件/文件夹）
        System.out.println(f1.getName());
        System.out.println(f2.getName());
        System.out.println(f3.getName());
        System.out.println();
        // .length()判断文件的大小，以字节为单位，不能判断文件夹的大小返回0，因为文件夹没有大小概念,路径不存在也返回0
        System.out.println(f1.length());
        System.out.println(f2.length());
        System.out.println(f3.length());
        System.out.println();

        // .delete() 删除文件（ps：文件夹中有东西则不会删除返回false，文件路径不对也返回false，且不走回收站直接在硬盘中删除）
        System.out.println(f3.delete());
        System.out.println(new File("E:\\Project\\JavaSE\\src\\B_File\\txtTest\\c.txt.txt").delete());
        System.out.println(new File("E:\\Project\\JavaSE\\src\\B_File\\a").delete());
        System.out.println();

        // 文件夹遍历，路径不存在则会报空指针异常，遍历文件也会报空指针异常
        File file = new File("E:\\Project\\JavaSE");
        // 遍历该路径文件夹下的所有文件和文件夹的 名称 ，包括隐藏文件和隐藏文件夹的 名称 ，返回值 String[] 类型
        for (String s : file.list()){
            System.out.println(s);
        }
        System.out.println();
        // 同上，只是返回值不一样，它返回值会把文件绝对路径封装成 File对象 ，返回值是 File[] 类型
        for (File file1 : file.listFiles()){
            System.out.println(file1);
        }
        System.out.println();

        // 用 递归 遍历指定目录下的所有文件
        new Demo01().getAllFile(file);
        System.out.println();

        // 获取指定目录下的指定后缀文件
        new Demo01().getSpecifiedFile(file,"iML");
        System.out.println();

        // 使用file自带两个过滤器筛选 FileFilter, FilenameFilter
        new Demo01().getFileFilter(file, "iml");
        System.out.println();
        new Demo01().FilenameFilter(file, "iml");
    }

    public void getAllFile(File file){
        if (file.isDirectory()){
            System.out.println("文件夹："+file.getName());
            for (File file1 : file.listFiles()){
                getAllFile(file1);
            }
        } else {
            System.out.println("文件："+file.getName());
        }
    }

    public void getSpecifiedFile(File file, String suffix){
        // 转小写
        suffix = suffix.toLowerCase();
        if (file.isDirectory()){
            for (File file1 : file.listFiles()){
                getSpecifiedFile(file1, suffix);
            }
        } else {
            String name = file.getName();
            // .endsWith() 是否以什么什么结尾
            if (name.endsWith(suffix)){
                System.out.println(name);
            }
        }
    }

    public void getFileFilter(File file, String suffix){
        // 列出筛选过滤过的文件和文件夹放入File数组，File pathname 放的是每一次筛选的文件或文件夹
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(suffix);
            }
        });
        for (File f : files){
            if (f.isDirectory()){
                getFileFilter(f, suffix);
            } else {
                System.out.println(f);
            }
        }
    }

    public void FilenameFilter(File file, String suffix){
        // 列出筛选过滤过的文件和文件夹放入File数组，File dir 放的是文件(夹)父路径， String name 放的是文件(夹)名称
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(suffix);
            }
        });
        for (File f : files){
            if (f.isDirectory()){
                FilenameFilter(f, suffix);
            } else {
                System.out.println(f);
            }
        }
    }

}
